package com.itheima.reggie.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.ShoppingCart;
import com.itheima.reggie.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

@RestController
@RequestMapping("/shoppingCart")
@Slf4j
public class ShoppingCartController {

    @Autowired
    private ShoppingCartService cartService;

    @PostMapping("/add")
    public R<ShoppingCart> add(@RequestBody ShoppingCart cart) {
        //打印
        log.info("购物车数据:{}", cart);
        // 1.获取当前用户的ID(ThreadLocal取)，赋值给cart对象
        Long currentID = BaseContext.getCurrentID();
        cart.setUserId(currentID);
        // 2.根据当前用户的ID及菜品ID或套餐ID，查询购物车对象,一定要找到对应的SQL
        //select * from shopping_cart where user_id = 1 and dish_id = 1
        //select * from shopping_cart where user_id = 1 and setmeal_id = 1
        // 一个用户，一道菜，肯定是一条记录
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        //拿数据
        queryWrapper.eq(ShoppingCart::getUserId, BaseContext.getCurrentID());
        if (cart.getDishId() != null) {
            //此时前端选的肯定就是菜品 因为菜品id不为空的话
            queryWrapper.eq(ShoppingCart::getDishId, cart.getDishId());
        } else {
            //此时不是菜品的话就是套餐 菜品id为空的话就是套餐
            queryWrapper.eq(ShoppingCart::getSetmealId, cart.getSetmealId());
        }
        //此时我们已经得到数据 我们需要调方法修改数据库
        ShoppingCart cartOne = cartService.getOne(queryWrapper);
        //内容不为空的情况下 我们操作数据库
        if (cartOne != null) {
            //如果不为空  说明添加过了 我们在原来的基础上数量(字段Number)加1
            cartOne.setNumber(cartOne.getNumber() + 1);
            //更新数据库
            cartService.updateById(cartOne);
        } else {
            //如果不存在的话 我们直接添加购物车  数量默认1
            //此时存数据库的从用户那边传过来的cart对象
            //修改数量
            cart.setNumber(1);
            //设置时间
            cart.setCreateTime(LocalDateTime.now());
            //添加购物车
            cartService.save(cart);
            //把存到数据库的Cart对象，临时赋值给cartOne,目的就是为了返回
            cartOne = cart;
        }
        //最终返回给前端页面展示
        return R.success(cartOne);
    }


    //这个方法是菜品或者套餐数量减一
    //http://localhost:8080/shoppingCart/sub
    @PostMapping("/sub")
    public R<ShoppingCart> sub(@RequestBody ShoppingCart cart) {
        //打印
        log.info("购物车数据:{}", cart);
        // 1.获取当前用户的ID(ThreadLocal取)，赋值给cart对象
        Long currentID = BaseContext.getCurrentID();
        cart.setUserId(currentID);
        // 2.根据当前用户的ID及菜品ID或套餐ID，查询购物车对象,一定要找到对应的SQL
        //select * from shopping_cart where user_id = 1 and dish_id = 1
        //select * from shopping_cart where user_id = 1 and setmeal_id = 1
        // 一个用户，一道菜，肯定是一条记录
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        //拿数据
        queryWrapper.eq(ShoppingCart::getUserId, BaseContext.getCurrentID());
        if (cart.getDishId() != null) {
            //此时前端选的肯定就是菜品 因为菜品id不为空的话
            queryWrapper.eq(ShoppingCart::getDishId, cart.getDishId());
        } else {
            //此时不是菜品的话就是套餐 菜品id为空的话就是套餐
            queryWrapper.eq(ShoppingCart::getSetmealId, cart.getSetmealId());
        }
        //此时我们已经得到数据 我们需要调方法修改数据库
        ShoppingCart cartOne = cartService.getOne(queryWrapper);
        //内容不为空的情况下 我们操作数据库
        if (cartOne != null) {
            //如果不为空  说明添加过了 我们在原来的基础上数量(字段Number)加1
            cartOne.setNumber(cartOne.getNumber() - 1);
            //更新数据库
            cartService.updateById(cartOne);
        }
        //} else {
        //    //如果不存在的话 我们直接添加购物车  数量默认1
        //    //此时存数据库的从用户那边传过来的cart对象
        //    //修改数量
        //    cart.setNumber(1);
        //    //设置时间
        //    cart.setCreateTime(LocalDateTime.now());
        //    //添加购物车
        //    cartService.save(cart);
        //    //把存到数据库的Cart对象，临时赋值给cartOne,目的就是为了返回
        //    cartOne = cart;
        //}
        //最终返回给前端页面展示
        return R.success(cartOne);
    }

    /**
     * 查看购物车
     * @return
     */
    @GetMapping("/list")
    public R<List<ShoppingCart>> list() {
        //打印
        log.info("查看购物车....");
        //根据当前登录用户ID查询购物车列表，并对查询的结果进行创建时间的倒序排序。
        //select * from reggie.shopping_cart where user_id = 多少 order by create_time;
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId, BaseContext.getCurrentID());
        queryWrapper.orderByAsc(ShoppingCart::getCreateTime);
        //封装返回
        List<ShoppingCart> list = cartService.list(queryWrapper);
        return R.success(list);
    }

    //请求 URL: http://localhost:8080/shoppingCart/clean
    //请求方法: DELETE
    /**
     *
     * @return
     */
    @DeleteMapping("/clean")
    public R<String> clean() {
        //SQL:delete from shopping_cart where user_id = ?
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId, BaseContext.getCurrentID());
        cartService.remove(queryWrapper);
        return R.success("清空购物车成功!!!");
    }
}
